package zhengqc.sort;

public class InsertionSort<E extends Comparable<E>> extends Sort<E> {
    public InsertionSort() {
        this.sortName = "InsertionSort";
    }
    public void sort(E[] array) {
        // 循环不变量: array[0...i) 是有序的; array[i...n) 是无序的
        for (int i = 0; i < array.length; ++i) {
            // 将 array[i] 插到合适的位置
            E t = array[i];
            int j = i;
            while (j >= 1 && t.compareTo(array[j-1]) < 0) {
                array[j] = array[j-1];
                --j;
            }
            array[j] = t;
        }
    }
    /* 对 array[left...right] 进行插入排序 */
    public void sort(E[] array, int left, int right) {
        // 循环不变量: array[left...i) 是有序的; array[i...right] 是无序的
        for (int i = left; i <= right; ++i) {
            // 将 array[i] 插到合适的位置
            E t = array[i];
            int j = i;
            while (j - 1 >= left && t.compareTo(array[j-1]) < 0) {
                array[j] = array[j-1];
                --j;
            }
            array[j] = t;
        }
    }
    private static <E> void swap(E[] array, int i, int j) {
        E t = array[i];
        array[i] = array[j];
        array[j] = t;
    }
}
/*    public static <E extends Comparable<E>> void sort(E[] array) {
        // 循环不变量: array[0...i) 是有序的; array[i...n) 是无序的
        for (int i = 1; i < array.length; ++i) {
            // 将 array[i] 插到合适的位置
//            for (int j = i; j >= 1 && array[j].compareTo(array[j-1]) < 0; --j) {
//                swap(array, j, j-1);
//            }
            int j = i;
            while (j >= 1 && array[j].compareTo(array[j-1]) < 0) {
                swap(array, j, j-1);
                --j;
            }
        }
    }*/